function [x_SI,info_SI] = SI(T_SI,c_SI,verifiche_SI)
//
// Funzione SI: calcola la colonna soluzione del sistema di equazioni lineari
//
//       T_SI x = c_SI
//
// quando la matrice T_SI è N x N triangolare superiore invertibile e c_SI è una
// colonna di N componenti.
//
// verifiche_SI = "disabilita": la procedura non verifica la conformità dei dati
//                              né l'invertibilità della matrice;
//              = "abilita": la procedura verifica la conformità dei dati
//                           e l'invertibilità della matrice; se qualche
//                           verifica ha esito negativo, si pone x_SI = %nan.
//
// x_SI: se i dati superano le verifiche, x_SI è la soluzione del sistema,
//       altrimenti x_SI = %nan
// info_SI = %nan: l'utente ha richiesto alla procedura di non fare verifiche
//                 sui dati;
//         = -2: opzione non valida per le verifiche (ovvero verifiche_SI
//               diverso da "abilita" e "disabilita");
//         = -1: se le dimensioni dei dati non sono compatibili o la matrice
//               non è triangolare superiore;
//         =  0: se T_SI(k,k) è nullo (ovvero T_SI non è invertibile);
//         =  1: la procedura ha verificato i dati e determinato la soluzione.
//
[NR, NC] = size(T_SI);
N = NR; // N è il numero di equazioni del sistema
if verifiche_SI == "abilita" then
   //
   // *** Verifica dimensioni e invertibilità
   //
   info_SI = 1; // resta tale solo se tutte le verifiche hanno esito positivo
   if NR ~= NC then info_SI = -1;
      printf("\n *** Errore: matrice non quadrata.\n\n");
   elseif size(c_SI,"r") ~= NR | size(c_SI,"c") ~= 1 then info_SI = -1;
      printf("\n *** Errore: dimensioni termine noto non compatibili.\n\n");
   end;
   if info_SI == 1 & max(abs(tril(T_SI,-1))) > 0 then info_SI = -1;
      printf("\n *** Errore: matrice non triangolare superiore.\n\n");
   end;
   if info_SI == 1 & find(diag(T_SI)==0) ~= [] then info_SI = 0;
      printf("\n *** Errore: elementi nulli sulla diagonale agli indici:\n");
      disp(find(diag(T_SI)==0)); printf("\n");
   end;
   //
   // *** Fine verifica dimensioni e invertibilità
   //
elseif verifiche_SI == "disabilita" then info_SI = %nan;
else printf("\n ***Errore: opzione non valida per verifiche" +...
            " (scelte: abilita/disabilita)\n\n");
     x_SI = %nan; info_SI = -2; return;
end;
if info_SI == 1 | isnan(info_SI) then
   //
   // *** Calcolo soluzione
   //
   x_SI = zeros(N,1);
   //
   x_SI(N) = c_SI(N) / T_SI(N,N);
   for k = N-1:-1:1,
       x_SI(k) = (c_SI(k) - T_SI(k,k+1:N)*x_SI(k+1:N)) / T_SI(k,k);
   end;
   //
   // *** Fine calcolo soluzione
   //
else x_SI = %nan; // se qualche verifica ha avuto esito negativo
end
endfunction
